/**
 * 
 * @brief  typedef.h
 * @param  None
 * 
 * @author xhq
 * @date   2024/11/05
 * 
 */
#ifndef __SRC_TYPEDEF_H__
#define __SRC_TYPEDEF_H__

/* include */
#include <stdio.h>
#include <math.h>
#include <bits/types.h>
#include <netinet/in.h>

#include "ini-wrapper.h"

#ifdef ARM_PLATM
#include <stdio.h>
#include <math.h>
#include <bits/types.h>
#else
#include <sys/socket.h>
#include <netinet/in.h>
#endif

/* define */
/* 原始数据格式 */
/* 每fram 8个通道， 每个通道128个chirp， 每个chirp 1024个采样点 */
#define   RAW_DATA_CHIRP_CHANNEL_NUM               8            // 原始数据通道数
#define   EACH_CHIRP_ADC_POINT_NUM                 1024         // 每个chirp的adc点数，每个chirp字节数为：1024x2

#define   RADAR_MAX_OBJECT_NUM                     512


#define    MIPI_CHANNEL_MAX                         4
#define    MIPI_RECV_THREAD_NUM                     4    // 4 * 2mipi

#define    CHIRP_LEN                                8192        //RAW_DATA_CHIRP_CHANNEL_NUM*EACH_CHIRP_ADC_POINT_NUM
#define    CHIRP_NUM                                128
#define    FRAME_LEN                                (CHIRP_LEN * CHIRP_NUM*4)      // 每个线程单次接收mipi数据量为4MB，即半帧

#define    RAW_DATA_CHIRP_NUM                      CHIRP_NUM   // 原始数据chirp数量

#define   QUEUE_RECV_DATA_NUM					   320	        // 存储数据的队列长度
#define   QUEUE_EACH_UNIT_MAX_LEN                  (FRAME_LEN + 1024)  // 4MB + 1KB， 4MB是半帧mipi数据的长度，也是mipi接收线程单次接收数据的长度，留1KB空间是防止数据意外溢出

#define MIN(a, b) ((a) <= (b) ? (a) : (b))
#define MAX(a, b) ((a) >= (b) ? (a) : (b))


/* typedef */
typedef __int8_t   int8_t;
typedef __int16_t  int16_t;
typedef __int32_t  int32_t;
typedef __int64_t  int64_t;

typedef __uint8_t  uint8_t;
typedef __uint16_t uint16_t;
typedef __uint32_t uint32_t;
typedef __uint64_t uint64_t;

/* 线程id */
typedef enum
{
    PTHREAD_NET_BROADCAST                 = 0,
    PTHREAD_NET,
    PTHREAD_NET_SEND_MIPI,
    PTHREAD_NET_SEND_TRACK_INFO,
    PTHREAD_NET_SEND_DSP_INFO,
    PTHREAD_DATA_PRO,
    PTHREAD_STATUS,
    PTHREAD_GTRACK,
    PTHREAD_MIPI_START,
    PTHREAD_NUM_MAX,
}pthread_pid_type;

/* socket类型 ：广播 / 指令（数据） */
typedef enum
{
    SOCKET_BROADCAST_TYPE           = 0,    
    SOCKET_CMD_TYPE,
    SOCKET_DATA_TYPE,
    SOCKET_TYPE_MAX,
}net_socket_type;

/*bin file type*/
typedef enum
{
    BIN_CONFIG_DEFAULT,
    BIN_CONFIG,
    BIN_UPDATE,
    BIN_FILE_MAX
} app_bin_file_name_etype;

/* ini file */
typedef enum
{
    INI_INFO=0,
    INI_NET_INFO,
    SECTION_MAX
} app_config_section_etype;

/* 校验类型 */
typedef enum
{
    TAG_NONE_CHECK        = 0x0000,
    TAG_BCC_CHECK,
    TAG_CRC_CHECK,
    TAG_CHECK_TYPE_MAX
}param_check_type_etype;

/* 队列中的数据是否有效 */
typedef enum
{
    INVALID_VALUE,
    VALID_VALUE,
    VALID_VALUE_MAX,
    
}queue_value_valid_etype;

/* socket参数类型 */
#ifdef ARM_PLATM
typedef struct
{
    int32_t fd;
    struct sockaddr_in sockaddr_ip4;
    struct sockaddr_in6 sockaddr_ip6;
}socket_info_type;
#else
typedef struct
{
    uint8_t ip_protocol;                    // 0:ipv4, 1:ipv6 
    uint8_t socket_type;                    // 0:SOCKET_BROCASE_TYPE, 1:SOCKET_CMD_TYPE
    int16_t fd; 
    uint16_t local_port;                    // 本地端口
    uint16_t dest_port;                     // 目标端口
    struct in_addr local_ip_ipv4;           // locol ip
    struct in_addr dest_ip_ipv4;            // dest ip

    struct sockaddr_in  local_sockaddr_ip4;
    struct sockaddr_in6 local_sockaddr_ip6;
    struct sockaddr_in  dest_sockaddr_ip4;
    struct sockaddr_in6 dest_sockaddr_ip6;
}socket_info_type;
#endif

/* 网络参数类型 */
typedef struct
{
    int32_t   ip4_local_ip;             // 本地ipv4地址
    int32_t   ip4_dest_ip;              // 目标IP
    uint8_t   ip4_mask[4];              // 子网掩码
    uint8_t   ip4_gateway[4];           // 默认网关

    uint8_t   ip6_global_ip[16];        // IPv6全球单播地址
    uint8_t   ip6_local_ip[16];         // IPv6本地链路地址
    uint8_t   ip6_mask[16];             // IPv6子网掩码
    uint8_t   ip6_gateway[16];          // IPv6网关
    uint8_t   ip6_dest_ip[16];          // IPv6上位机IP

    uint16_t  data_local_port;          // 数据通信端口号,默认3333
    uint16_t  data_dest_port;           // 数据目标端口号
    uint16_t  cmd_local_port;           // 配置数据通信端口号,默认3333
    uint16_t  cmd_dest_port;            // 配置数据目标端口号

    uint8_t   mac[6];                   // MAC
    uint8_t   data_protocol;            // 数据发送使用协议 IPv4/IPv6
    uint8_t   cmd_protocol;             // 配置数据使用协议 IPv4/IPv6
}net_info_type;

/* ini file paser config start */
// INI 文件信息项
typedef struct 
{
    struct section_info section;
    struct member_info project_name;
    struct member_info sw_version;
    struct member_info compile_time;
} ini_info_type;

// net param
typedef struct 
{
    struct section_info section;
    struct member_info ip4_local_ip;
    struct member_info ip4_dest_ip;
    struct member_info ip4_mask;
    struct member_info ip4_gateway;
    // ipv6
    struct member_info ip_ipv6;
    struct member_info ip_local_ipv6;
    struct member_info ip_global_ipv6;
    struct member_info mask_ipv6;
    struct member_info gateway_ipv6;
    // cmd/data port
    struct member_info data_local_port;
    struct member_info data_dest_port;
    struct member_info cmd_local_port;
    struct member_info cmd_dest_port;
    struct member_info mac;
    // protocol 0:ipv4, 1:ipv6
    struct member_info data_protocol;
    struct member_info cmd_protocol;
} ini_net_info_type;

/* sys param */
typedef struct 
{
    struct ini_config appsys;
    struct ini_config appsys_backup;
    struct ini_config appsys_default;
    ini_info_type ini_info;
    ini_net_info_type ini_net_info;
} sys_config_type;

/* 应用程序本地路径 */
typedef struct
{
    uint32_t init_flag;                 // 0:未初始化，1：初始化正常
    char root_path[256];                // 应用程序根目录 app 路径
    char file_path[BIN_FILE_MAX][256];  // 应用程序根目录下文件路径
    char path[512];                     // 临时目录缓存
} app_path_type;
/* 系统信息参数 */
typedef struct
{
    app_path_type app_path;         // 应用根目录路径
    sys_config_type sys_config;     // 系统配置文件
} sys_info_type;
/* ini file paser config end */

/* 帧原始数据 */
typedef struct
{
    /* 原始数据 8×128x1024x2, 8channel, 128个chirp，1024个采样点（每个2Byte）*/
    struct
    {
        uint16_t raw_adc_data[RAW_DATA_CHIRP_NUM][EACH_CHIRP_ADC_POINT_NUM];
    }channel[RAW_DATA_CHIRP_CHANNEL_NUM];
} fram_raw_data_type;

/* 原始数据信息 */
typedef struct
{
    uint8_t   *pu8_mmap;                                          // 映射内存逻辑地址
    uint32_t  intr_cycle_count;                                   // 中断计数，每次触发mipi中断，计数加一
    uint64_t  raw_data_addr;                                      // 原始数据ddr地址
} fram_raw_data_info_type;

/* 设备状态信息 */
typedef struct
{
    /* dsp版本号 */
    uint8_t dsp_version[24];     

    uint8_t status1;
    uint8_t status2;
    uint16_t status3;

}device_status_type;

/* Recv mipi data buffer queue*/
typedef struct _STRUCT_MIPI
{
    uint8_t     m_utctime[QUEUE_RECV_DATA_NUM][8];
	uint8_t     *m_u8buffer[QUEUE_RECV_DATA_NUM]/* [QUEUE_EACH_UNIT_MAX_LEN] */;       // 600个数组，每个数组的长度为4MB+1KB(QUEUE_EACH_UNIT_MAX_LEN）；
	int         m_i8fd[QUEUE_RECV_DATA_NUM];
	uint8_t     m_u8valid[QUEUE_RECV_DATA_NUM];
	uint32_t    m_u32length[QUEUE_RECV_DATA_NUM];
	uint16_t    fifoin;
	uint16_t    fifoout;
} STRUCT_MIPI;

/* store object struct */
typedef struct
{
    uint32_t index_info[RADAR_MAX_OBJECT_NUM];     // 目标索引（高16位为速度维度（0-127）， 低16位为距离维度（0-511））
    float    noise_SNR[RADAR_MAX_OBJECT_NUM];      // 目标噪声信噪比
    float    velocity[RADAR_MAX_OBJECT_NUM];       // 目标真实速度
    float    distance[RADAR_MAX_OBJECT_NUM];       // 目标的距离
    float    azimuth[RADAR_MAX_OBJECT_NUM];        // 目标的方位角
    float    DOA_snr[RADAR_MAX_OBJECT_NUM];        // 测角信噪比

    uint32_t object_num;                           // 真实检测到的目标个数 <= 512
    uint32_t object_max_num;                       // 最大目标个数 512
}object_info_type;

#endif